Learn in 10 minutes

Learn in 10 minutes

10분 안에 Ruby 배우기

Ruby는 우아한 문법과 개발자 친화적인 기능으로 유명한 동적 객체 지향 프로그래밍 언어입니다. 이 튜토리얼은 Ruby의 핵심 개념을 다루어 빠르게 언어를 배울 수 있도록 도와줍니다.

1. 첫 번째 Ruby 프로그램 작성하기

간단한 프로그램부터 시작해보겠습니다. hello.rb라는 파일을 생성하고 다음 코드를 입력하세요:

puts "Hello, World!"

파일을 저장하고 터미널에서 다음 명령어를 실행하세요:

ruby hello.rb

출력 결과는 다음과 같습니다:

Hello, World!

이 간단한 프로그램은 Ruby의 기본 출력 기능을 보여줍니다. puts 메서드는 콘솔에 텍스트 정보를 표시하는 데 사용됩니다.

2. 기본 문법

Ruby의 문법은 깔끔하고 가독성이 좋으며, 자연스럽고 직관적으로 설계되었습니다.

# 이것은 주석입니다
puts "Hello, World!"

Ruby의 기본 문법 규칙:

  • 주석: 한 줄 주석은 #으로 시작하고, 여러 줄 주석은 =begin=end를 사용합니다.
  • 문장: 일반적으로 한 줄에 하나의 문장을 작성하며, 끝에 세미콜론 ;이 필요하지 않습니다.
  • 코드 블록: do...end 또는 중괄호 {}로 정의합니다.
  • 메서드 호출: 인수가 없는 메서드 호출에는 괄호를 생략할 수 있습니다.

여러 줄 주석 예시:

=begin
이것은 여러 줄 주석입니다,
여러 줄에 걸쳐 있습니다.
=end

3. 변수와 데이터 타입

Ruby에서 변수는 동적으로 타입이 지정되며 명시적 타입 선언이 필요하지 않습니다.

기본 변수 명명 규칙:

  • 변수 이름은 문자, 숫자, 밑줄만 포함할 수 있습니다.
  • 변수 이름은 숫자로 시작할 수 없습니다.
  • 변수 이름은 대소문자를 구분합니다.
  • Ruby 키워드는 변수 이름으로 사용할 수 없습니다.

Ruby의 주요 기본 데이터 타입:

  • 정수 (Integer): 예: 42 또는 -10
  • 부동소수점 (Float): 예: 3.14 또는 2.5e3
  • 문자열 (String): 예: "hello" 또는 'world', 작은따옴표나 큰따옴표 사용
  • 불리언 (Boolean): true 또는 false
  • Nil (Nil): nil로 표현되며, null 또는 값 없음을 나타냄
  • 심볼 (Symbol): 예: :name, 불변 식별자

3.1 숫자 타입

Ruby는 정수와 부동소수점 숫자를 지원합니다.

# 정수
age = 25
population = 1_000_000  # 가독성을 위한 밑줄

# 부동소수점
temperature = 36.5
pi = 3.14159

# 연산
puts 10 + 5   # 15
puts 10 / 3   # 3 (정수 나눗셈)
puts 10.0 / 3 # 3.333... (부동소수점 나눗셈)

3.2 문자열

문자열은 문자 시퀀스로, 작은따옴표나 큰따옴표로 묶습니다.

single_quote = '작은따옴표 문자열'
double_quote = "큰따옴표 문자열"
multiline = "이것은
여러 줄
문자열입니다"

# 문자열 보간 (큰따옴표에서만 가능)
name = "Alice"
greeting = "안녕하세요, #{name}!"
puts greeting  # "안녕하세요, Alice!"

문자열 연산:

text = "Ruby 프로그래밍"
puts text.length        # 문자열 길이
puts text.upcase        # 대문자로 변환
puts text.downcase      # 소문자로 변환
puts text[0]            # 첫 번째 문자 접근
puts text[0..3]         # 문자열 슬라이싱
puts text.include?("Ruby")  # 포함 여부 확인

3.3 불리언 타입

불리언 타입은 truefalse 두 가지 값을 가집니다.

is_active = true
is_complete = false

# 불리언 연산
result1 = true && false  # false
result2 = true || false  # true
result3 = !true          # false

3.4 Nil 타입

nil은 null 또는 값 없는 상태를 나타냅니다.

value = nil

if value.nil?
  puts "값이 null입니다"
end

3.5 심볼

심볼은 불변 식별자로, 주로 해시의 키로 사용됩니다.

:name
:email
:created_at

# 심볼 vs 문자열
puts :name.object_id == :name.object_id  # true (같은 객체)
puts "name".object_id == "name".object_id  # false (다른 객체)

4. 데이터 구조

Ruby는 데이터를 저장하고 조작하기 위한 여러 내장 데이터 구조를 제공합니다.

4.1 배열

배열은 여러 값을 보관할 수 있는 순서가 있는 컬렉션입니다.

numbers = [1, 2, 3, 4, 5]
numbers.push(6)        # 요소 추가
numbers.unshift(0)     # 시작 부분에 삽입
numbers.delete(3)      # 특정 값 제거
numbers[0] = 10        # 요소 수정
puts numbers.inspect   # [10, 2, 4, 5, 6]

배열 연산:

numbers = [10, 20, 30, 40, 50]
puts numbers[1..3]     # [20, 30, 40]
puts numbers.first     # 10
puts numbers.last      # 50
puts numbers.include?(30)  # true

4.2 해시

해시는 키-값 쌍의 컬렉션으로, 다른 언어의 딕셔너리와 유사합니다.

student = {
  name: "John",
  age: 20,
  major: "Computer Science"
}

# 해시 접근 및 수정
puts student[:name]
student[:age] = 21
student[:gpa] = 3.8

# 해시 순회
student.each do |key, value|
  puts "#{key}: #{value}"
end

5. 제어 흐름

Ruby는 프로그램 실행을 관리하기 위한 여러 제어 흐름 문을 제공합니다.

5.1 if 문

if 문은 조건을 평가하고 조건이 참일 때 블록을 실행합니다.

age = 20
if age >= 18
  puts "성인"
elsif age >= 13
  puts "청소년"
else
  puts "어린이"
end

# 한 줄 if
puts "성인" if age >= 18

5.2 unless 문

unlessif의 반대로, 조건이 거짓일 때 실행됩니다.

age = 15
unless age >= 18
  puts "성인이 아닙니다"
end

# 한 줄 unless
puts "성인이 아닙니다" unless age >= 18

5.3 case 문

case 문은 여러 조건을 처리하는 깔끔한 방법을 제공합니다.

grade = "B"

case grade
when "A"
  puts "우수"
when "B"
  puts "좋음"
when "C"
  puts "보통"
else
  puts "개선 필요"
end

5.4 반복문

Ruby는 다양한 반복 구조를 지원합니다.

while 반복문:

count = 0
while count < 5
  puts count
  count += 1
end

until 반복문:

count = 0
until count >= 5
  puts count
  count += 1
end

for 반복문:

for i in 0..4
  puts i
end

each 반복자:

(0..4).each do |i|
  puts i
end

# 배열과 함께 사용
fruits = ["apple", "banana", "cherry"]
fruits.each do |fruit|
  puts fruit
end

break와 next:

(0..9).each do |i|
  break if i == 5     # 반복문 종료
  next if i % 2 == 0  # 짝수 건너뛰기
  puts i              # 출력: 1, 3
end

6. 메서드

Ruby에서 메서드는 def 키워드를 사용하여 정의합니다.

기본 메서드 정의:

def greet(name)
  "안녕하세요, #{name}!"
end

# 메서드 호출
message = greet("John")
puts message

기본 매개변수:

def greet(name, greeting = "안녕하세요")
  "#{greeting}, #{name}!"
end

puts greet("Alice")          # "안녕하세요, Alice!"
puts greet("Bob", "안녕")      # "안녕, Bob!"

가변 인수:

def sum_numbers(*numbers)
  numbers.sum
end

puts sum_numbers(1, 2, 3, 4)  # 10

키워드 인수:

def create_person(name:, age:, city: "Unknown")
  { name: name, age: age, city: city }
end

person = create_person(name: "Alice", age: 25)
puts person.inspect

7. 블록과 Proc

블록은 메서드에 전달할 수 있는 코드 덩어리입니다.

블록 사용:

# do...end 사용
3.times do
  puts "안녕하세요!"
end

# 중괄호 사용
3.times { puts "안녕하세요!" }

# 매개변수가 있는 블록
(1..3).each do |number|
  puts "숫자: #{number}"
end

Yield 키워드:

def run_block
  puts "블록 전"
  yield
  puts "블록 후"
end

run_block { puts "블록 내부" }

Proc:

Proc은 블록을 캡슐화하는 객체입니다.

square = Proc.new { |x| x * x }
puts square.call(5)  # 25

# 메서드에 Proc 전달
def apply_operation(numbers, operation)
  numbers.map { |n| operation.call(n) }
end

numbers = [1, 2, 3, 4]
squares = apply_operation(numbers, square)
puts squares.inspect  # [1, 4, 9, 16]

8. 클래스와 객체

Ruby는 모든 것이 객체인 순수 객체 지향 언어입니다.

기본 클래스 정의:

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "저는 #{@name}이고, #{@age}살입니다"
  end

  def have_birthday
    @age += 1
    "#{@name}의 생일입니다, 이제 #{@age}살이 되었습니다"
  end
end

# 객체 생성
person1 = Person.new("John", 25)
person2 = Person.new("Jane", 30)

puts person1.introduce
puts person2.have_birthday

접근자 메서드:

class Person
  attr_reader :name    # 읽기 접근
  attr_writer :age     # 쓰기 접근
  attr_accessor :city  # 읽기/쓰기 접근

  def initialize(name, age, city)
    @name = name
    @age = age
    @city = city
  end
end

person = Person.new("Alice", 25, "New York")
puts person.name      # "Alice"
person.age = 26       # 나이 설정
person.city = "Boston" # 도시 설정
puts person.city      # "Boston"

클래스 메서드와 변수:

class Student
  @@student_count = 0  # 클래스 변수

  def initialize(name)
    @name = name
    @@student_count += 1
  end

  def self.student_count  # 클래스 메서드
    @@student_count
  end
end

student1 = Student.new("John")
student2 = Student.new("Jane")
puts Student.student_count  # 2

상속:

class Animal
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name}가 소리를 냅니다"
  end
end

class Dog < Animal
  def speak
    "#{@name}가 짖습니다"
  end
end

class Cat < Animal
  def speak
    "#{@name}가 야옹합니다"
  end
end

dog = Dog.new("Buddy")
cat = Cat.new("Mimi")

puts dog.speak  # "Buddy가 짖습니다"
puts cat.speak  # "Mimi가 야옹합니다"

9. 모듈과 믹스인

모듈은 관련 메서드와 상수를 그룹화하는 데 사용되며, 클래스에 혼합될 수 있습니다.

모듈 정의:

module Speakable
  def speak
    "#{@name}가 무언가를 말합니다"
  end
end

class Person
  include Speakable

  def initialize(name)
    @name = name
  end
end

person = Person.new("Alice")
puts person.speak  # "Alice가 무언가를 말합니다"

모듈을 이용한 네임스페이싱:

module Math
  PI = 3.14159

  def self.square(x)
    x * x
  end
end

puts Math::PI        # 3.14159
puts Math.square(5)  # 25

10. 예외 처리

Ruby는 begin, rescue, ensure, raise를 사용하여 강력한 예외 처리를 제공합니다.

기본 예외 처리:

begin
  result = 10 / 0
rescue ZeroDivisionError => e
  puts "0으로 나눌 수 없습니다: #{e.message}"
else
  puts "나눗셈 성공"
ensure
  puts "이것은 항상 실행됩니다"
end

예외 발생:

def divide(a, b)
  raise "0으로 나눌 수 없습니다" if b == 0
  a / b
end

begin
  result = divide(10, 0)
rescue => e
  puts "오류: #{e.message}"
end

11. 파일 작업

Ruby는 파일 읽기와 쓰기를 위한 간단한 메서드를 제공합니다.

파일 읽기:

# 전체 파일 읽기
content = File.read("example.txt")
puts content

# 줄 단위로 읽기
File.foreach("example.txt") do |line|
  puts line.chomp
end

파일 쓰기:

# 파일에 쓰기
File.write("output.txt", "안녕하세요, Ruby!\n")

# 파일에 추가
File.open("output.txt", "a") do |file|
  file.puts "새로운 내용을 추가합니다."
end

12. 유용한 내장 메서드

Ruby는 많은 유용한 내장 메서드를 제공합니다.

문자열 메서드:

text = "  Ruby 프로그래밍  "
puts text.strip        # 공백 제거
puts text.split(" ")   # 배열로 분할
puts text.gsub("Ruby", "Python")  # 교체

배열 메서드:

numbers = [3, 1, 4, 1, 5, 9, 2]
puts numbers.sort.inspect      # [1, 1, 2, 3, 4, 5, 9]
puts numbers.uniq.inspect      # [3, 1, 4, 5, 9, 2]
puts numbers.select { |n| n > 3 }.inspect  # [4, 5, 9]

해시 메서드:

person = { name: "Alice", age: 25, city: "New York" }
puts person.keys.inspect    # [:name, :age, :city]
puts person.values.inspect  # ["Alice", 25, "New York"]
puts person.has_key?(:age)  # true

13. Ruby Gems

RubyGems는 라이브러리 설치 및 관리를 위한 Ruby의 패키지 관리자입니다.

Gems 설치:

gem install rails

코드에서 Gems 사용:

require 'json'

# JSON 파싱
json_string = '{"name": "Alice", "age": 25}'
person = JSON.parse(json_string)
puts person["name"]  # "Alice"

# JSON 생성
person_hash = { name: "Bob", age: 30 }
json_output = JSON.generate(person_hash)
puts json_output  # {"name":"Bob","age":30}

14. Ruby 스타일 가이드

Ruby는 깔끔하고 가독성 있는 코드를 장려하는 강력한 커뮤니티 스타일 가이드를 가지고 있습니다.

들여쓰기: 들여쓰기에 2개의 공백을 사용합니다.

명명 규칙:

  • 변수와 메서드: snake_case
  • 클래스와 모듈: CamelCase
  • 상수: SCREAMING_SNAKE_CASE

괄호: 인수가 있는 메서드 호출에는 괄호를 사용하고, 인수가 없는 메서드 호출에는 괄호를 생략합니다.

블록: 여러 줄 블록에는 do...end를, 한 줄 블록에는 {}를 사용합니다.

Ruby의 우아한 문법과 강력한 기능은 작업을 즐겁게 만듭니다. 개발자의 행복과 생산성에 초점을 맞춘 점은 웹 개발, 스크립팅, 자동화 작업에서 인기 있는 언어가 되었습니다.